home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / e / AEPD24.lha / EPD24 / Amiga_E-Programme / AG2TXT / AG2TXT13.e < prev    next >
Text File  |  1994-08-16  |  7KB  |  314 lines

  1. /* AmigaGuide to Text converter (v2). Copyright (c) 1994, Jason R. Hulance */
  2. /* E version.  For AmigaDos 1.3 or before (?).  Very slow because it lacks */
  3. /* buffering on the I/O, and it's not likely to be added by me, either :-) */
  4.  
  5. ENUM N_INIT, N_OUT, N_IN, NODE_STATES
  6. ENUM L_INIT, L_QUOTED, L_SPACED, LINE_STATES
  7. ENUM A_INIT, A_AT, A_BRAC, A_IGNORE, A_END, AT_STATES
  8. ENUM NO_ERR, ERR_FILE, ERR_DATA, ERR_BRK, NUM_ERRS
  9.  
  10. CONST MAX_LINE_LEN=1024, MAX_WIDTH=120, CMP_EQUAL=0, CMP_UNEQUAL=1
  11.  
  12. DEF in[MAX_LINE_LEN]:STRING, outh=NIL
  13.  
  14. ENUM        BOLD,     ITALIC,     F_LINK,       TITLE,  HIGHLIGHT,  OTHER
  15.  
  16. PROC write_ansi(type, on=TRUE)
  17.   DEF ansi:PTR TO LONG
  18.   /*        BOLD      ITALIC      F_LINK        TITLE   HIGHLIGHT   OTHER */
  19.   IF on
  20.     ansi:=['\e[1m',  '\e[3m',  '\e[1m\e[3m',   '\e[7m',  '\e[1m',  '\e[1m']
  21.   ELSE
  22.     ansi:=['\e[22m', '\e[23m', '\e[23m\e[22m', '\e[0m', '\e[22m', '\e[22m']
  23.   ENDIF
  24.   fputs(outh, ansi[type])
  25. ENDPROC
  26.  
  27. PROC fputc(fh, c) IS Out(fh, c)
  28. PROC fputs(fh, s) IS Write(fh, s, StrLen(s))
  29.  
  30. PROC toupper(c) IS IF (c<"a") OR (c>"z") THEN c ELSE c-32
  31.  
  32. PROC stricmp(s1, s2, all=TRUE)
  33.   WHILE (s2[]<>0) AND (s1[]<>0)
  34.     IF toupper(s1[]++)<>s2[]++ THEN RETURN CMP_UNEQUAL
  35.   ENDWHILE
  36.   IF all
  37.     RETURN IF (s1[] OR s2[]) THEN CMP_UNEQUAL ELSE CMP_EQUAL
  38.   ELSE
  39.     RETURN IF s2[] THEN CMP_UNEQUAL ELSE CMP_EQUAL
  40.   ENDIF
  41. ENDPROC
  42.  
  43. PROC main() HANDLE
  44.   DEF fh, status=N_INIT, s, title[MAX_WIDTH]:STRING,
  45.       empty=TRUE, top, bot, ownout=TRUE, err
  46.   s, arg:=get_word(arg)
  47.   IF (fh:=Open(s, OLDFILE))=NIL THEN Raise(ERR_FILE)
  48.   IF arg[]
  49.     s:=get_word(arg)
  50.     IF s[]
  51.       outh:=Open(s, NEWFILE)
  52.     ENDIF
  53.   ENDIF
  54.   IF outh=NIL
  55.     WriteF('')
  56.     outh:=stdout
  57.     ownout:=FALSE
  58.   ENDIF
  59.   top:='\n--------------------------------------' +
  60.        '--------------------------------------\n'
  61.   bot:='======================================' +
  62.        '======================================\n'
  63.   REPEAT
  64.     err:=ReadStr(fh, in)
  65.     SELECT NODE_STATES OF status
  66.     CASE N_INIT
  67.       IF stricmp(in, '@DATABASE', FALSE)<>CMP_EQUAL
  68.         Raise(ERR_DATA)
  69.       ELSE
  70.         status:=N_OUT
  71.       ENDIF
  72.     CASE N_OUT
  73.       IF stricmp(in, '@NODE ', FALSE)=CMP_EQUAL
  74.         status:=N_IN
  75.     parse_node_line(in+STRLEN, title)
  76.         empty:=TRUE
  77.       ENDIF
  78.     CASE N_IN
  79.       IF empty AND (stricmp(in, '@TITLE', FALSE)=CMP_EQUAL)
  80.     parse_title_line(in+STRLEN, title)
  81.       ELSEIF stricmp(in, '@ENDNODE', FALSE)=CMP_EQUAL
  82.         fputs(outh, bot)
  83.     status:=N_OUT
  84.       ELSE
  85.         IF CtrlC() THEN Raise(ERR_BRK)
  86.         s:=TrimStr(in)
  87.         IF Not(empty AND (s[]=0))
  88.           IF empty
  89.             write_ansi(TITLE)
  90.             fputs(outh, title)
  91.             write_ansi(TITLE, FALSE)
  92.             fputs(outh, top)
  93.             empty:=FALSE
  94.           ENDIF
  95.           output(in)
  96.         ENDIF
  97.       ENDIF
  98.     ENDSELECT
  99.   UNTIL err=-1
  100. EXCEPT DO
  101.   SELECT NUM_ERRS OF exception
  102.   CASE ERR_FILE
  103.     WriteF('Could not open file "\s"\n', s)
  104.   CASE ERR_DATA
  105.     WriteF('"\s" is not an AmigaGuide file\n')
  106.   CASE ERR_BRK
  107.     WriteF('User aborted\n')
  108.   ENDSELECT
  109.   IF ownout AND outh THEN Close(outh)
  110.   IF fh THEN Close(fh)
  111. ENDPROC
  112.  
  113. PROC output(line)
  114.   DEF status=A_INIT, gotbrac, c
  115.   IF line[]="@" THEN IF line[1]<>"{" THEN RETURN
  116.   WHILE c:=line[]
  117.     SELECT c
  118.     CASE "\\"
  119.       IF status=A_INIT
  120.         status:=A_IGNORE
  121.       ELSE
  122.         statecopy(status)
  123.         fputc(outh, c)
  124.         status:=A_INIT
  125.       ENDIF
  126.       line++
  127.     CASE "@"
  128.       IF status=A_INIT
  129.         status:=A_AT
  130.       ELSE
  131.         IF status<>A_IGNORE THEN statecopy(status)
  132.         fputc(outh, c)
  133.         status:=A_INIT
  134.       ENDIF
  135.       line++
  136.     CASE "{"
  137.       IF status=A_AT
  138.         status:=A_BRAC
  139.       ELSE
  140.         statecopy(status)
  141.         fputc(outh, c)
  142.         status:=A_INIT
  143.       ENDIF
  144.       line++
  145.     CASE "}"
  146.       SELECT AT_STATES OF status
  147.       CASE A_BRAC, A_END
  148.       DEFAULT
  149.         statecopy(status)
  150.         fputc(outh, c)
  151.       ENDSELECT
  152.       status:=A_INIT
  153.       line++
  154.     DEFAULT
  155.       SELECT AT_STATES OF status
  156.       CASE A_BRAC
  157.         line,gotbrac:=parse_at_line(line)
  158.         status:=IF gotbrac THEN A_INIT ELSE A_END
  159.       CASE A_END
  160.         line++
  161.       DEFAULT
  162.         statecopy(status)
  163.         fputc(outh, c)
  164.         status:=A_INIT
  165.         line++
  166.       ENDSELECT
  167.     ENDSELECT
  168.   ENDWHILE
  169.   fputc(outh, "\n")
  170. ENDPROC
  171.  
  172. PROC statecopy(state)
  173.   SELECT AT_STATES OF state
  174.   CASE A_IGNORE
  175.     fputc(outh, "\\")
  176.   CASE A_AT
  177.     fputc(outh, "@")
  178.   CASE A_BRAC
  179.     fputs(outh, '@{')
  180.   ENDSELECT
  181. ENDPROC
  182.  
  183. PROC parse_at_line(line)
  184.   DEF first, second, third, gotbrac, i=0, on=TRUE, c
  185.   first,line,gotbrac:=get_word(line, TRUE)
  186.   IF first[]
  187.     i:=1
  188.     IF gotbrac=FALSE
  189.       second,line,gotbrac:=get_word(line, TRUE)
  190.       IF second[]
  191.         i:=2
  192.         IF gotbrac=FALSE
  193.           third,line,gotbrac:=get_word(line, TRUE)
  194.           IF third[] THEN i:=3
  195.         ENDIF
  196.       ENDIF
  197.     ENDIF
  198.   ENDIF
  199.   SELECT 4 OF i
  200.   CASE 1
  201.     IF toupper(first[])="U"
  202.       on:=FALSE
  203.       first++
  204.     ENDIF
  205.     c:=toupper(first[])
  206.     SELECT c
  207.     CASE "B"
  208.       write_ansi(BOLD, on)
  209.     CASE "I"
  210.       write_ansi(ITALIC, on)
  211.     ENDSELECT
  212.   CASE 2
  213.     IF stricmp(first, 'FG')=CMP_EQUAL
  214.       IF stricmp(second, 'HIGHLIGHT')=CMP_EQUAL
  215.         write_ansi(HIGHLIGHT)
  216.       ELSEIF stricmp(second, 'TEXT')=CMP_EQUAL
  217.         write_ansi(HIGHLIGHT, FALSE)
  218.       ENDIF
  219.     ELSEIF (stricmp(second, 'CLOSE')=CMP_EQUAL) OR
  220.            (stricmp(second, 'QUIT')=CMP_EQUAL)
  221.       write_ansi(OTHER)
  222.       fputs(outh, first)
  223.       write_ansi(OTHER, FALSE)
  224.     ENDIF
  225.   CASE 3
  226.     IF (stricmp(second, 'LINK')=CMP_EQUAL) OR
  227.        (stricmp(second, 'ALINK')=CMP_EQUAL)
  228.       write_ansi(F_LINK)
  229.       fputs(outh, first)
  230.       write_ansi(F_LINK, FALSE)
  231.     ELSE
  232.       write_ansi(OTHER)
  233.       fputs(outh, first)
  234.       write_ansi(OTHER, FALSE)
  235.     ENDIF
  236.   ENDSELECT
  237. ENDPROC line,gotbrac
  238.  
  239. PROC parse_node_line(line, title)
  240.   DEF first, second
  241.   first,line:=get_word(line)
  242.   second,line:=get_word(line)
  243.   IF first[]
  244.     IF second[]
  245.       StrCopy(title, second)
  246.     ELSE
  247.       StrCopy(title, first)
  248.     ENDIF
  249.   ENDIF
  250. ENDPROC
  251.  
  252. PROC parse_title_line(line, title)
  253.   DEF first
  254.   first,line:=get_word(line)
  255.   IF first[]
  256.     StrCopy(title, first)
  257.   ENDIF
  258. ENDPROC
  259.  
  260. CONST L_SIZE=35
  261.  
  262. PROC get_word(line, chkbrac=FALSE)
  263.   DEF status=L_INIT, noword=TRUE, foundbrac=FALSE,
  264.       t=NIL, to, special=FALSE
  265.   to:=line
  266.   WHILE line[] AND noword
  267.     IF to<>line THEN to[]:=line[]
  268.     SELECT L_SIZE OF line[]
  269.     CASE "\q"
  270.       IF special
  271.         to++
  272.       ELSE
  273.         SELECT LINE_STATES OF status
  274.         CASE L_INIT
  275.           status:=L_QUOTED
  276.           t:=line+1
  277.           to++
  278.         CASE L_QUOTED
  279.           to[]:=0
  280.           noword:=FALSE
  281.         DEFAULT
  282.           to++
  283.         ENDSELECT
  284.       ENDIF
  285.     CASE "\n", "\t", " "
  286.       IF status=L_SPACED
  287.         to[]:=0
  288.         noword:=FALSE
  289.       ELSE
  290.         to++
  291.       ENDIF
  292.     DEFAULT
  293.       IF chkbrac AND (line[]="}")
  294.         to[]:=0
  295.         noword:=FALSE
  296.         foundbrac:=TRUE
  297.       ELSE
  298.         IF status=L_INIT
  299.           t:=line
  300.           status:=L_SPACED
  301.         ENDIF
  302.         to++
  303.       ENDIF
  304.     ENDSELECT
  305.     IF special
  306.       special:=FALSE
  307.     ELSEIF line[]="\\"
  308.       special:=TRUE
  309.       to--
  310.     ENDIF
  311.     line++
  312.   ENDWHILE
  313. ENDPROC t,line,foundbrac
  314.